package com.example.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by HMF on 2021/09/26 18:07
 */

/**
 * 该爬虫主要的功能是爬取图片
 * 大概思路：
 * 1.获取图片 img 标签的父标签 div
 * 2.通过一层一层节点元素的获取，最终找打 图片所在的 img 标签
 * 3.然后获取 img 标签的 图片连接属性 data-src，这个就是我们所要找的 图片链接
 * 4.把获取的到图片链接，通过输入输出流转化为图片，并把图片保存到本地磁盘 D:\images 目录下
 */
public class JsoupSpider {

    public static void main(String[] args) throws Exception {
        String url = "https://mp.weixin.qq.com/s/YPrqMOYYrAtCni2VT8c4jA";
        Document document = Jsoup.parse(new URL(url), 10000); // 对路劲进行解析

        Element content = document.getElementById("js_content"); /// 通过元素Id获取元素，即图片所处的父标签
        System.out.println(content); //

        Elements imgs = content.getElementsByTag("img");/// 通过标签名获取 img 图片元素
        System.out.println(imgs); //
        System.out.println(); //

        int id = 0; // 图片的名字，通过自增数字表示

        for (Element img : imgs) {  // 遍历 img 图片元素数组，获取它的 data-src 属性值，即为所需的图片链接
            String imgLink = img.attr("data-src"); // 取 img 标签 data-src 属性的值
            System.out.println(imgLink);

            // 通过输入输出流把图片链接转化成图片保存到磁盘
            // 获取输入流
            URL target = new URL(imgLink);
            URLConnection urlConnection = target.openConnection();
            InputStream inputStream = urlConnection.getInputStream();

            if (id == 10) {  // 因为图片太多，我就在这里控制只输出 10 张了，完整输出是，去掉这段代码即可
                break;
            }

            id++;

            // 输出流
            OutputStream outputStream = new FileOutputStream("D:\\images\\" + id + ".jpg");  // 参数中还需要指定图片的名字
            int temp = 0;
            while ((temp = inputStream.read()) != -1) {
                outputStream.write(temp);
            }
            System.out.println(id + ".jpg 下载完毕！");
            outputStream.close();
            inputStream.close();
        }
    }
}
